﻿#define ex4
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Common;

using System.Transactions;
using System.Data.EntityClient;

using System.Messaging;
using System.Configuration;

namespace AulaPrática4 {
    class Program {
        static void Main(string[] args) {

            AP4 context = new AP4();
            #region Exercicio 1
#if ex1
            //**********************************************************            
            // Exercício 1 (COMENTE O CÓDIGO DOS RESTANTES EXERCÍCIOS)
            
            try {
                //foreach (var c in context.Condutor) {
                foreach (var c in context.Condutor.Include("Acidente")) {
                    Console.WriteLine(c.Bi);
                    //foreach (var a in context.Acidente.Where(a => a.Condutor.Bi.Equals(c.Bi)))
                    foreach (var a in context.Acidente.Where(a => a.Condutor.Bi.Equals(c.Bi)))
                            Console.WriteLine("\t" + a.ano);
                }
            } catch (Exception e) {
                Console.WriteLine(e.Message);
            }
#endif 
            #endregion
           
            #region Exercicio 2
#if ex2
            //**********************************************************
            // Exercício 2 (COMENTE O CÓDIGO DOS RESTANTES EXERCÍCIOS)

            //ponto 0 (observação e clear trace)
            var q = from c in context.Condutor
                    where c.Bi.Equals("1111")
                    select c;
            // ponto 1 (observação)
            foreach (var c in q)
                Console.WriteLine(c.Bi);

            // ponto 2 (observação e clear trace)
            var c1 = (from c in context.Condutor
                      where c.Bi.Equals("1111")
                      select c)
                      .First();

            // ponto 3 (observação e clear trace)

            var q1 = context.Condutor.Include("Acidente").Execute(System.Data.Objects.MergeOption.AppendOnly);

            // ponto 4 (observação e clear trace)
            foreach (var c in q1) {
                Console.WriteLine(c.Bi);
                foreach (var a in c.Acidente)
                    Console.WriteLine(a.ano);
            }
            // ponto 5 (observação)
            Console.ReadLine();
#endif
            #endregion

            #region Exercicio 3
#if ex3
            //**********************************************************
            // Exercício 3 (COMENTE O CÓDIGO DOS RESTANTES EXERCÍCIOS)
            Console.WriteLine("Ex 3");
            Condutor nc = Condutor.CreateCondutor("6666", "C-6666");
            context.AddObject("AP4.Condutor", nc);
            context.SaveChanges();

            //context.Detach(nc);
            nc.nome = "kkkk";
            Acidente na = Acidente.CreateAcidente(6, true, 2009);
            nc.Acidente.Add(na);
            //context.Attach(nc);
            context.SaveChanges();
            foreach (var c in context.Condutor.Where(c => c.Bi.Equals("6666"))) {
                Console.WriteLine("Condutor {0}", c.Bi);
                foreach (var a in c.Acidente)
                    Console.WriteLine("   {0} {1}", a.id, a.ano);
            }

            Console.ReadLine();
#endif
            #endregion

            #region Exercicio 4
#if ex4
            //**********************************************************
            // Exercício 4  (COMENTE O CÓDIGO DOS RESTANTES EXERCÍCIOS)
            
            EntityConnection con = new EntityConnection(ConfigurationManager.ConnectionStrings["AP4"].ConnectionString);
            AP4 context1 = new AP4(con);
            AP4 context2 = new AP4(con);
            using (var tr = new TransactionScope()) {
                // Para conseguir o mesmo efeito com o Sql Server 2008, fazer:
                context1.Connection.Open();
                context2.Connection.Open();
                var cc1 = (from c in context1.Condutor
                           where c.Bi.Equals("3333")
                           select c)
                         .First();
                cc1.nome = "Nome CC1";

                var cc2 = (from c in context2.Condutor
                           where c.Bi.Equals("1111")
                           select c)
                         .First();
                cc2.nome = "Nome CC2";
                context1.SaveChanges();
                context2.SaveChanges();
                tr.Complete();
            }
            context1.Dispose();
            context2.Dispose();
#endif
            #endregion

            #region Exercicio 5
#if ex5
            //**********************************************************
            // Exercício 5  (COMENTE O CÓDIGO DOS RESTANTES EXERCÍCIOS)
            Console.WriteLine("Ex 5");

            using (var tr = new TransactionScope()) {
                MessageQueue fila = new MessageQueue(@".\private$\Fila1");
                Message m = new Message();
                m.Formatter = new BinaryMessageFormatter();
                m.Label = "TesteTr";
                m.Body = "Isto é um teste";
                fila.Send(m);
                Condutor nc1 = Condutor.CreateCondutor("7777", "C-7777");
                context.AddObject("AP4.Condutor", nc1);
                context.SaveChanges();

                tr.Complete();
            }
            Console.ReadLine();
            // Observar a fila e a base de dados 
#endif
            #endregion

        }
    }
}
